import logging

from flask import abort
from flask import g, jsonify, render_template, current_app, request
from info.constants import HOME_PAGE_MAX_NEWS
from info.models import News, Category
from info.utils.common import verify_login
from info.utils.response_code import RET, error_map
from . import index_blue


@index_blue.route("/favicon.ico")
def favicon():
    # 向浏览器发送标题图标
    return current_app.send_static_file('news/favicon.ico')


# 判断用户当前是否登录
@index_blue.route("/")
@verify_login
def index():
    # 右边热门新闻排序
    # 根据新闻点击量来进行倒序,只要前10
    news_model = News.query.order_by(News.clicks.desc()).limit(HOME_PAGE_MAX_NEWS)

    # 定义一个list,用来放前十的新闻
    news_list = []
    for news in news_model:
        news_list.append(news.to_dict())

    # 最上边的新闻分类
    categories_model = Category.query.all()

    # 定义一个list,用来存放新闻分类
    categories_list = []

    for news_categorization in categories_model:
        categories_list.append(news_categorization.to_dict())

    data = {
        "user_info": g.user.to_dict() if g.user else None,
        "categories": categories_list,
        "news_list": news_list,
    }

    return render_template('news/index.html', data=data)


# 新闻列表的展示
@index_blue.route("/news_list")
def details_list():
    """
       获取指定分类的新闻列表
       1. 获取参数
       2. 校验参数
       3. 查询数据
       4. 返回数据
       :return:
    """

    # 1.获取前端传来的参数
    # 获取当前分类
    cid = request.args.get("cid", "1")

    # 获取当前页
    page = request.args.get("page", "1")

    # 获取每页显示数据条数
    per_page = request.args.get("per_page", "10")

    # 2.校验参数
    try:
        cid = int(cid)
        page = int(page)
        per_page = int(per_page)

    except Exception as a:
        current_app.logger.error(a)

    # 3.查询数据
    # 创建一个用来装新闻的列表
    filters = [News.status == 0]
    if cid != 1:
        filters.append(News.category_id == cid)

    # 进行分页查询
    # paginate()分页显示的函数,第一个参数从第几页开始显示
    # 第二个参数是每页显示多少数据
    # 第三个如果没有数据显示了,默认返回404给用户,设置为False就是返回空列表给用户
    paging_news_list = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page, False)

    # paginate.items返回一个列表
    items = paging_news_list.items

    # paginate.page 当前页数
    current_page = paging_news_list.page

    # paginate.pages 总页数
    total_page = paging_news_list.pages

    # 创建一个用来传输新闻的列表
    news_lsit = []
    for news in items:
        news_lsit.append(news.to_dict())

    data = {
        # 表示当前页面需要展示的数据
        "news_dict_li": news_lsit,

        # 表示当前页面
        "current_page": current_page,

        # 一共有多少个页面
        "total_page": total_page,

        # 分类id
        "cid": cid
    }

    return jsonify(errno=RET.OK, errmsg=error_map.get(RET.OK), data=data)
